#include "cthreadsafebuffer.h"

#include <QGlobalStatic>
#include <QDebug>
/**
  QGlobalStatic 类是 Qt 框架中的一个辅助类，用于实现全局静态对象。
  它可以帮助你在程序的不同部分安全地访问和使用一个静态对象，而无需担心初始化顺序问题或潜在的内存泄漏。
  使用 QGlobalStatic 可以确保对象在程序需要时被创建，并且在程序结束时自动销毁。这在实现单例模式或者需要共享的全局资源时非常有用。
*/

// 必须放在.cpp实现文件
Q_GLOBAL_STATIC(CThreadSafeBuffer, g_instance)


CThreadSafeBuffer::CThreadSafeBuffer()
{
    qDebug() << " g_instance.exists = " << g_instance.exists();
}

CThreadSafeBuffer::~CThreadSafeBuffer()
{
   qDebug() << " g_instance.isDestroyed = " << g_instance.isDestroyed();
}

CThreadSafeBuffer* CThreadSafeBuffer::getInstance()
{
    return g_instance();
}

bool CThreadSafeBuffer::isExists()
{
    return g_instance.exists();
}

bool CThreadSafeBuffer::isDestroyed()
{
    return g_instance.isDestroyed();
}

void CThreadSafeBuffer::showMessage(const QString &message) {
    qDebug() << "Message from MySingleton:" << message;
    qDebug() << " g_instance.exists = " << g_instance.exists();
}


void CThreadSafeBuffer::enqueue(const QByteArray& data)
{
    QMutexLocker locker(&m_mutex);
    m_buffer.enqueue(data);
    m_notEmpty.wakeOne(); // 唤醒一个等待的线程
}

QByteArray CThreadSafeBuffer::dequeue(int timeout)
{
    QMutexLocker locker(&m_mutex);
    if (timeout == 0) {
        while (m_buffer.isEmpty()) {
            m_notEmpty.wait(&m_mutex); // 无限期等待直到队列非空
        }
    } else {
        if (m_buffer.isEmpty()) {
            m_notEmpty.wait(&m_mutex, timeout); // 等待指定时间
        }
    }
    if (!m_buffer.isEmpty()) {
        return m_buffer.dequeue();
    }
    return QByteArray(); // 如果超时且队列为空，返回空的 QByteArray
}

bool CThreadSafeBuffer::isEmpty() const
{
    QMutexLocker locker(&m_mutex);
    return m_buffer.isEmpty();
}

int CThreadSafeBuffer::size() const
{
    QMutexLocker locker(&m_mutex);
    return m_buffer.size();
}
